const isPlainObject = (val) =>
  Object.prototype.toString.call(val) === '[object Object]'

const isPlainArray = (val) => Array.isArray(val)

function hashQueryKey(queryKey) {
  return JSON.stringify(queryKey, (_, val) => {
    // console.log('hash', val)
    return isPlainObject(val)
      ? Object.keys(val)
          // 按照首字母进行排序
          .sort()
          .reduce((result, key) => {
            result[key] = val[key]
            return result
          }, {})
      : val
  })
}

// const result = hashQueryKey(['ab', { name: 'cd', age: 18, b: 22 }])
// console.log(result, typeof result)

function replaceEqualDeep(a, b) {
  if (a === b) {
    return a
  }

  const array = isPlainArray(a) && isPlainArray(b)

  // 都是数组 或者 都是对象
  if (array || (isPlainObject(a) && isPlainObject(b))) {
    const aSize = array ? a.length : Object.keys(a).length
    const bItems = array ? b : Object.keys(b)

    const bSize = bItems.length
    const copy = array ? [] : {}

    let equalItems = 0

    for (let i = 0; i < bSize; i++) {
      // key
      const key = array ? i : bItems[i]

      copy[key] = replaceEqualDeep(a[key], b[key])

      if (copy[key] === a[key]) {
        equalItems++
      }
    }

    return aSize === bSize && equalItems === aSize ? a : copy
  }

  return b
}

const a = { a: 1, b: 2 }
const b = { a: 1 }
const result = replaceEqualDeep(a, b)
console.log(result)
